package Interfaces;


import HLW;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;

import IA.Accion;
import IA.Estado;
import IA.MinMax;
import Motor.Carta;
import Motor.Juego;


public class PantallaJuego extends Canvas{
	
	Figura[] almacen;
	int puntero=0;
	Display display;
	int turno;
	int fase;
	Juego juego;
	
	double porcentX=(double)getWidth()/240;
	double porcentY=(double)getHeight()/320;
	//MODO 0: 2 jugadores reales
	//MODO 1: contra cpu
	private int mode=0;
	
	public PantallaJuego(Display d,Juego j,int t, int f){
		almacen= new Figura[14];
		almacen[0]=new Figura((int)((19.0/240.0)*getWidth()),
							  (int)((5.0/320.0)*getHeight()),
							  (int)(45*porcentX),
							  (int)(60*porcentY));
		almacen[1]=new Figura((int)((73.0/240.0)*getWidth()),
				  			  (int)((5.0/320.0)*getHeight()),
							  (int)(45*porcentX),
							  (int)(60*porcentY));
		almacen[2]=new Figura((int)((126.0/240.0)*getWidth()),
							  (int)((5.0/320.0)*getHeight()),
							  (int)(45*porcentX),
							  (int)(60*porcentY));
		almacen[3]=new Figura((int)((19.0/240.0)*getWidth()),
							  (int)((80.0/320.0)*getHeight()),
							  (int)(45*porcentX),
							  (int)(60*porcentY));
		almacen[4]=new Figura((int)((72.0/240.0)*getWidth()),
							  (int)((80.0/320.0)*getHeight()),
							  (int)(45*porcentX),
							  (int)(60*porcentY));
		almacen[5]=new Figura((int)((125.0/240.0)*getWidth()),
				  			  (int)((80.0/320.0)*getHeight()),
							  (int)(45*porcentX),
							  (int)(60*porcentY));
		almacen[6]=new Figura((int)((178.0/240.0)*getWidth()),
				 			  (int)((80.0/320.0)*getHeight()),
							  (int)(45*porcentX),
							  (int)(60*porcentY));
		almacen[7]=new Figura((int)((19.0/240.0)*getWidth()),
							  (int)((155.0/320.0)*getHeight()),
							  (int)(45*porcentX),
							  (int)(60*porcentY));
		almacen[8]=new Figura((int)((72.0/240.0)*getWidth()),
							  (int)((155.0/320.0)*getHeight()),
							  (int)(45*porcentX),
							  (int)(60*porcentY));
		almacen[9]=new Figura((int)((125.0/240.0)*getWidth()),
							  (int)((155.0/320.0)*getHeight()),
							  (int)(45*porcentX),
							  (int)(60*porcentY));
		almacen[10]=new Figura((int)((178.0/240.0)*getWidth()),
							   (int)((155.0/320.0)*getHeight()),
							   (int)(45*porcentX),
							   (int)(60*porcentY));
		almacen[11]=new Figura(getWidth()-(int)((168.0/240.0)*getWidth()),
							   (int)((230.0/320.0)*getHeight()),
							   (int)(45*porcentX),
							   (int)(60*porcentY));
		almacen[12]=new Figura(getWidth()-(int)((115.0/240.0)*getWidth()),
							   (int)((230.0/320.0)*getHeight()),
							   (int)(45*porcentX),
							   (int)(60*porcentY));
		almacen[13]=new Figura(getWidth()-(int)((62.0/240.0)*getWidth()),
							   (int)((230.0/320.0)*getHeight()),
							   (int)(45*porcentX),
							   (int)(60*porcentY));
		this.display=d;
		turno=t;
		fase=f;
		juego=j;
	}
	
	void setTurno(int t){
		turno=t;
	}
	void setFase(int f){
		fase=f;
	}
	
	protected void paint(Graphics g) {
		
		Image imagen;
		
		// TODO Auto-generated method stub
		//pintamos el tablero base
		try{
			imagen=Image.createImage("/Imagenes/FondoJuego.png");
						
			porcentX=(double)getWidth()/240;
			porcentY=(double)getHeight()/320;
			
			//CALCULO DE REDIMENSIONADO DE IMAGENES
			
			almacen[0]=new Figura((int)((19.0/240.0)*getWidth()),
					  (int)((5.0/320.0)*getHeight()),
					  (int)(45*porcentX),
					  (int)(60*porcentY));
			almacen[1]=new Figura((int)((73.0/240.0)*getWidth()),
		  			  (int)((5.0/320.0)*getHeight()),
					  (int)(45*porcentX),
					  (int)(60*porcentY));
			almacen[2]=new Figura((int)((126.0/240.0)*getWidth()),
					  (int)((5.0/320.0)*getHeight()),
					  (int)(45*porcentX),
					  (int)(60*porcentY));
			almacen[3]=new Figura((int)((19.0/240.0)*getWidth()),
					  (int)((80.0/320.0)*getHeight()),
					  (int)(45*porcentX),
					  (int)(60*porcentY));
			almacen[4]=new Figura((int)((72.0/240.0)*getWidth()),
					  (int)((80.0/320.0)*getHeight()),
					  (int)(45*porcentX),
					  (int)(60*porcentY));
			almacen[5]=new Figura((int)((125.0/240.0)*getWidth()),
		  			  (int)((80.0/320.0)*getHeight()),
					  (int)(45*porcentX),
					  (int)(60*porcentY));
			almacen[6]=new Figura((int)((178.0/240.0)*getWidth()),
		 			  (int)((80.0/320.0)*getHeight()),
					  (int)(45*porcentX),
					  (int)(60*porcentY));
			almacen[7]=new Figura((int)((19.0/240.0)*getWidth()),
					  (int)((155.0/320.0)*getHeight()),
					  (int)(45*porcentX),
					  (int)(60*porcentY));
			almacen[8]=new Figura((int)((72.0/240.0)*getWidth()),
					  (int)((155.0/320.0)*getHeight()),
					  (int)(45*porcentX),
					  (int)(60*porcentY));
			almacen[9]=new Figura((int)((125.0/240.0)*getWidth()),
					  (int)((155.0/320.0)*getHeight()),
					  (int)(45*porcentX),
					  (int)(60*porcentY));
			almacen[10]=new Figura((int)((178.0/240.0)*getWidth()),
					   (int)((155.0/320.0)*getHeight()),
					   (int)(45*porcentX),
					   (int)(60*porcentY));
			almacen[11]=new Figura(getWidth()-(int)((168.0/240.0)*getWidth()),
					   (int)((230.0/320.0)*getHeight()),
					   (int)(45*porcentX),
					   (int)(60*porcentY));
			almacen[12]=new Figura(getWidth()-(int)((115.0/240.0)*getWidth()),
					   (int)((230.0/320.0)*getHeight()),
					   (int)(45*porcentX),
					   (int)(60*porcentY));
			almacen[13]=new Figura(getWidth()-(int)((62.0/240.0)*getWidth()),
					   (int)((230.0/320.0)*getHeight()),
					   (int)(45*porcentX),
					   (int)(60*porcentY));
			
			imagen=Carta.scaleImage(imagen, 
					(int)(imagen.getWidth()*porcentX),
					(int)(imagen.getHeight()*porcentY));
			g.drawImage(imagen,
					    0,
					    0,
					   (Graphics.TOP|Graphics.LEFT));
			
			//MARCAMOS EL NUMERO DE CARTAS
			Font font=Font.getFont(Font.FACE_PROPORTIONAL,Font.STYLE_BOLD ,Font.SIZE_LARGE);
			g.setFont(font);
			g.setColor(0, 255, 0);
			String s= ""+juego.getJugador()[(turno+1)%2].numCartas();
			g.drawString(s, (int)(225*porcentX), (int)(20*porcentY), Graphics.HCENTER|Graphics.BASELINE);
			
			s= ""+juego.getJugador()[turno].numCartas();
			g.drawString(s, (int)(10*porcentX), (int)(290*porcentY), Graphics.HCENTER|Graphics.BASELINE);
		}catch(Exception e){
			g.setColor(0, 200, 0);
		}
		
		
		//Pintamos las imagenes
		int i=0;
		while (i<almacen.length){
			if(i==0){
				try{
					imagen=Image.createImage("/Imagenes/CartaBack.png");
					imagen=Carta.scaleImage(imagen,almacen[i].getAncho(),almacen[i].getAlto());
					g.drawImage(imagen,
							    almacen[i].getX()+almacen[i].getAncho()/2,
							    almacen[i].getY()+almacen[i].getAlto()/2,
							   (Graphics.VCENTER|Graphics.HCENTER));
				}catch(Exception e){
					g.setColor(0, 200, 0);
				}
			}else if(i==1){
				try{
					imagen=Image.createImage("/Imagenes/CartaBack.png");

					imagen=Carta.scaleImage(imagen,almacen[i].getAncho(),almacen[i].getAlto());
					g.drawImage(imagen,
							    almacen[i].getX()+almacen[i].getAncho()/2,
							    almacen[i].getY()+almacen[i].getAlto()/2,
							   (Graphics.VCENTER|Graphics.HCENTER));
				}catch(Exception e){
					g.setColor(0, 200, 0);
				}			
			}else if(i==2){
				try{
					imagen=Image.createImage("/Imagenes/CartaBack.png");

					imagen=Carta.scaleImage(imagen,almacen[i].getAncho(),almacen[i].getAlto());
					g.drawImage(imagen,
							    almacen[i].getX()+almacen[i].getAncho()/2,
							    almacen[i].getY()+almacen[i].getAlto()/2,
							   (Graphics.VCENTER|Graphics.HCENTER));
				}catch(Exception e){
					g.setColor(0, 200, 0);
				}
			}else if(i==3){
				imagen=juego.getJugador()[(turno+1)%2].getHeros().verCarta(0).getIcono();

				imagen=Carta.scaleImage(imagen,almacen[i].getAncho(),almacen[i].getAlto());
				g.drawImage(imagen,
						    almacen[i].getX()+almacen[i].getAncho()/2,
						    almacen[i].getY()+almacen[i].getAlto()/2,
						   (Graphics.VCENTER|Graphics.HCENTER));
			}else if(i==4){
				imagen=juego.getJugador()[(turno+1)%2].getHeros().verCarta(1).getIcono();

				imagen=Carta.scaleImage(imagen,almacen[i].getAncho(),almacen[i].getAlto());
				g.drawImage(imagen,
						    almacen[i].getX()+almacen[i].getAncho()/2,
						    almacen[i].getY()+almacen[i].getAlto()/2,
						   (Graphics.VCENTER|Graphics.HCENTER));
			}else if(i==5){
				imagen=juego.getJugador()[(turno+1)%2].getHeros().verCarta(2).getIcono();

				imagen=Carta.scaleImage(imagen,almacen[i].getAncho(),almacen[i].getAlto());
				g.drawImage(imagen,
						    almacen[i].getX()+almacen[i].getAncho()/2,
						    almacen[i].getY()+almacen[i].getAlto()/2,
						   (Graphics.VCENTER|Graphics.HCENTER));
			}else if(i==6){
				imagen=juego.getJugador()[(turno+1)%2].getHeros().verCarta(3).getIcono();

				imagen=Carta.scaleImage(imagen,almacen[i].getAncho(),almacen[i].getAlto());
				g.drawImage(imagen,
						    almacen[i].getX()+almacen[i].getAncho()/2,
						    almacen[i].getY()+almacen[i].getAlto()/2,
						   (Graphics.VCENTER|Graphics.HCENTER));
			}else if(i==7){
				imagen=juego.getJugador()[turno].getHeros().verCarta(0).getIcono();

				imagen=Carta.scaleImage(imagen,almacen[i].getAncho(),almacen[i].getAlto());
				g.drawImage(imagen,
						    almacen[i].getX()+almacen[i].getAncho()/2,
						    almacen[i].getY()+almacen[i].getAlto()/2,
						   (Graphics.VCENTER|Graphics.HCENTER));
			}else if(i==8){
				imagen=juego.getJugador()[turno].getHeros().verCarta(1).getIcono();

				imagen=Carta.scaleImage(imagen,almacen[i].getAncho(),almacen[i].getAlto());
				g.drawImage(imagen,
						    almacen[i].getX()+almacen[i].getAncho()/2,
						    almacen[i].getY()+almacen[i].getAlto()/2,
						   (Graphics.VCENTER|Graphics.HCENTER));
			}else if(i==9){
				imagen=juego.getJugador()[turno].getHeros().verCarta(2).getIcono();

				imagen=Carta.scaleImage(imagen,almacen[i].getAncho(),almacen[i].getAlto());
				g.drawImage(imagen,
						    almacen[i].getX()+almacen[i].getAncho()/2,
						    almacen[i].getY()+almacen[i].getAlto()/2,
						   (Graphics.VCENTER|Graphics.HCENTER));
			}else if(i==10){
				imagen=juego.getJugador()[turno].getHeros().verCarta(3).getIcono();

				imagen=Carta.scaleImage(imagen,almacen[i].getAncho(),almacen[i].getAlto());
				g.drawImage(imagen,
						    almacen[i].getX()+almacen[i].getAncho()/2,
						    almacen[i].getY()+almacen[i].getAlto()/2,
						   (Graphics.VCENTER|Graphics.HCENTER));
			}else if(i==11 && juego.getJugador()[turno].getMano()[0]!=-1){
				imagen=juego.getJugador()[turno].getDeck().verCarta(juego.getJugador()[turno].getMano()[0]).getIcono();

				imagen=Carta.scaleImage(imagen,almacen[i].getAncho(),almacen[i].getAlto());
				g.drawImage(imagen,
						    almacen[i].getX()+almacen[i].getAncho()/2,
						    almacen[i].getY()+almacen[i].getAlto()/2,
						   (Graphics.VCENTER|Graphics.HCENTER));
			}else if(i==12&& juego.getJugador()[turno].getMano()[1]!=-1){
				imagen=juego.getJugador()[turno].getDeck().verCarta(juego.getJugador()[turno].getMano()[1]).getIcono();

				imagen=Carta.scaleImage(imagen,almacen[i].getAncho(),almacen[i].getAlto());
				g.drawImage(imagen,
						    almacen[i].getX()+almacen[i].getAncho()/2,
						    almacen[i].getY()+almacen[i].getAlto()/2,
						   (Graphics.VCENTER|Graphics.HCENTER));
			}else if(i==13&& juego.getJugador()[turno].getMano()[2]!=-1){
				imagen=juego.getJugador()[turno].getDeck().verCarta(juego.getJugador()[turno].getMano()[2]).getIcono();

				imagen=Carta.scaleImage(imagen,almacen[i].getAncho(),almacen[i].getAlto());
				g.drawImage(imagen,
						    almacen[i].getX()+almacen[i].getAncho()/2,
						    almacen[i].getY()+almacen[i].getAlto()/2,
						   (Graphics.VCENTER|Graphics.HCENTER));
			}
			
			//Dibujamos el rect�ngulo
			//g.fillRect(almacen[i].x, almacen[i].y,
			//		   almacen[i].ancho, almacen[i].alto););
			i++;
		}
		
		
		//dibujamos la seleccion
		g.setColor(255,255,0);
		g.setStrokeStyle(Graphics.DOTTED);
		g.drawRect(almacen[puntero].getX()-2, almacen[puntero].getY()-2,
				almacen[puntero].getAncho()+4, almacen[puntero].getAlto()+4);
		
		//ESCRIBIMOS EN LA PARTE INFERIOR DE LA PANTALLA FASE Y TURNO
		Font font=Font.getFont(Font.FACE_MONOSPACE,Font.STYLE_PLAIN ,Font.SIZE_SMALL);
		g.setFont(font);
		g.setColor(0, 255, 255);
		String s= "FASE: "+fase+"   TURNO: "+turno+"      ";
		g.drawString(s, 0, getHeight()-(int)(10*porcentY), Graphics.TOP|Graphics.LEFT);
	}
	
	protected void keyPressed(int keyCode){
		
		if(keyCode==-1){
			puntero=(puntero+1)%almacen.length;repaint();
		}else if(keyCode==-2){
			puntero=puntero-1;
			if(puntero==-1){puntero=almacen.length-1;};
			repaint();
		}else if(keyCode==-5){
			Carta caux=null;
			if(puntero>2 && puntero<11){
				switch(puntero){
				case 3:
					caux=juego.getJugador()[(turno+1)%2].getHeros().getList()[0];
					break;
				case 4:
					caux=juego.getJugador()[(turno+1)%2].getHeros().getList()[1];
					break;
				case 5:
					caux=juego.getJugador()[(turno+1)%2].getHeros().getList()[2];
					break;
				case 6:
					caux=juego.getJugador()[(turno+1)%2].getHeros().getList()[3];
					break;
				case 7:
					caux=juego.getJugador()[turno].getHeros().getList()[0];
					break;
				case 8:
					caux=juego.getJugador()[turno].getHeros().getList()[1];
					break;
				case 9:
					caux=juego.getJugador()[turno].getHeros().getList()[2];
					break;
				case 10:
					caux=juego.getJugador()[turno].getHeros().getList()[3];
					break;
				}
				if(mode==1){
					HLW.pC.setMode(mode);
				}				
				HLW.pC.setTipo(3);
				HLW.pC.setFase(fase);
				HLW.pC.setTurno(turno);
				HLW.pC.setMode(mode);
				HLW.pC.setCarta(caux);
				HLW.pC.setFullScreenMode(true);
				display.setCurrent(HLW.pC);
			}
			if (puntero>10 && juego.getJugador()[turno].getMano()[puntero-11]!=-1){
				switch(puntero){
				case 11:
					caux=juego.getJugador()[turno].getDeck().getList()[juego.getJugador()[turno].getMano()[0]];
					break;
				case 12:
					caux=juego.getJugador()[turno].getDeck().getList()[juego.getJugador()[turno].getMano()[1]];
					break;
				case 13:
					caux=juego.getJugador()[turno].getDeck().getList()[juego.getJugador()[turno].getMano()[2]];
				break;
				}
				if(mode==1){
					HLW.pC.setMode(mode);
				}	
				HLW.pC.setTipo(2);
				HLW.pC.setFase(fase);
				HLW.pC.setTurno(turno);
				HLW.pC.setCarta(caux);
				HLW.pC.setPuntCarta(puntero);
				HLW.pC.setFullScreenMode(true);
				display.setCurrent(HLW.pC);
			}
		}else if(keyCode==-8){
			if (fase==1 || fase == 3){
				if(mode==0){
					turno=(turno+1)%2;
					if (turno==0){fase++;}
				}else if(mode==1){
					//avanzo instante
					turno = (turno + 1) % 2;
					if (turno == 0) {
						fase++;
					}
					//Hago llamada a la IA
					Estado e= new Estado(juego, fase, turno);
					MinMax m=new MinMax(9);
					Accion c=m.minMax(turno,e);
					e=e.applyAction(c,turno);
					turno = e.getTurno();
					fase=e.getFase();
					//actualizo valores
					juego.setJugador(e.getJugador());
					juego.setLuchador(e.getLuchador());
					HLW.pCom.setMode(mode);
					HLW.pCom.setJuego(juego);
				}
				HLW.pCom.setTurno(turno);
				HLW.pCom.setFase(fase);
				HLW.pCom.setFullScreenMode(true);
				display.setCurrent(HLW.pCom);
			}
		}
	}

	protected void pointerPressed(int _x, int _y){
		int aux=0;
		boolean b=false;
		while(!b && aux<almacen.length ){
			b=almacen[aux].pertenece(_x, _y);
			aux++;
		}
		if(b){
			aux--;
			Carta caux=null;
			if(aux>2 && aux<11){
				switch(aux){
				case 3:
					caux=juego.getJugador()[(turno+1)%2].getHeros().getList()[0];
					break;
				case 4:
					caux=juego.getJugador()[(turno+1)%2].getHeros().getList()[1];
					break;
				case 5:
					caux=juego.getJugador()[(turno+1)%2].getHeros().getList()[2];
					break;
				case 6:
					caux=juego.getJugador()[(turno+1)%2].getHeros().getList()[3];
					break;
				case 7:
					caux=juego.getJugador()[turno].getHeros().getList()[0];
					break;
				case 8:
					caux=juego.getJugador()[turno].getHeros().getList()[1];
					break;
				case 9:
					caux=juego.getJugador()[turno].getHeros().getList()[2];
					break;
				case 10:
					caux=juego.getJugador()[turno].getHeros().getList()[3];
					break;
				}
				HLW.pC.setTipo(3);
				HLW.pC.setFase(fase);
				HLW.pC.setTurno(turno);
				HLW.pC.setCarta(caux);
				HLW.pC.setMode(mode);
				HLW.pC.setFullScreenMode(true);
				display.setCurrent(HLW.pC);
			}
			if (aux>10 && juego.getJugador()[turno].getMano()[aux-11]!=-1){
				switch(aux){
				case 11:
					caux=juego.getJugador()[turno].getDeck().getList()[juego.getJugador()[turno].getMano()[0]];
					break;
				case 12:
					caux=juego.getJugador()[turno].getDeck().getList()[juego.getJugador()[turno].getMano()[1]];
					break;
				case 13:
					caux=juego.getJugador()[turno].getDeck().getList()[juego.getJugador()[turno].getMano()[2]];
				break;
				}
				HLW.pC.setTipo(2);
				HLW.pC.setFase(fase);
				HLW.pC.setTurno(turno);
				HLW.pC.setCarta(caux);
				HLW.pC.setPuntCarta(aux);
				HLW.pC.setFullScreenMode(true);
				display.setCurrent(HLW.pC);
			}
		}
		repaint();
	}
	
	protected void pointerDragged(int x, int y){
		if (fase==1 || fase == 3){
			if(mode==0){
				turno=(turno+1)%2;
				if (turno==0){fase++;}
			}else if(mode==1){
				//avanzo instante
				turno = (turno + 1) % 2;
				if (turno == 0) {
					fase++;
				}
				//Hago llamada a la IA
				Estado e= new Estado(juego, fase, turno);
				MinMax m=new MinMax(9);
				Accion c=m.minMax(turno,e);
				e=e.applyAction(c,turno);
				turno = e.getTurno();
				fase=e.getFase();
				//actualizo valores
				juego.setJugador(e.getJugador());
				juego.setLuchador(e.getLuchador());
				HLW.pCom.setMode(mode);
				HLW.pCom.setJuego(juego);
			}
			HLW.pCom.setTurno(turno);
			HLW.pCom.setFase(fase);
			HLW.pCom.setFullScreenMode(true);
			display.setCurrent(HLW.pCom);
		}
	}

	public void setMode(int i) {
		// TODO Auto-generated method stub
		mode=1;
	}

	public void setJuego(Juego j1) {
		// TODO Auto-generated method stub
		juego=j1;
	}

}
